package com.example.demokotlin

import org.junit.Test
// 导入扩展文件
import com.example.demokotlin.randomTake
import com.example.demokotlin.addBrackets as bracketString

/**
 * 扩展函数
 * 扩展可以在不直接修改类定义的情况下增加类功能。
 * 扩展可以用于自定义类，也可用于List, String，以及Kotlin标准库中里的其他类。
 * 与继承类似，扩展也能共享类行为。
 * 在你无法解除某个类定义，或者某个类没有使用open修饰符，
 * 导致你无法继承它时，扩展就是增加类功能的最好选择。
 *
 * 切换JDK方法：
 * Preferences->Build,Compiler,Development-->Build Tools-->Gradle->Gradle JDK(选择AndroidStudio自带的JDK)
 *
 * @author zhouronghua
 * @time 2021/9/24 8:52 上午
 */
class ExtractTest {

    /**
     * 添加花样
     *
     * @author zhouronghua
     * @time 2021/9/26 7:36 下午
     */
    fun String.addDecorate(amount: Int = 1) = this + "@".repeat(amount)

    /**
     * infix: infix适用于有单个参数的扩展和类函数，可以让你以更简洁的语法调用函数，
     * 如果一个函数定义使用infix，那么调用它时，接收者和函数之间的点操作
     * 以及参数的一对括号都可以不要。
     * fun String?.printWithDefault(default: String): () -> Unit = { println(this?: default) }
     * 使用infix以后，一对括号可以去掉
     *
     * 扩展用于可空函数，在可空类型上定义扩展函数，你可以在扩展体内
     * 直接解决可能出现的空值问题
     * 打印可能为空的字符串，为空打印默认值
     */
    infix fun String?.printWithDefault(default: String) = println(this ?: default)

    /**
     * 简单打印
     */
    fun <T> T.easyPrint(): T {
        println(this)
        return this
    }

    /**
     * 测试字符串扩展函数
     *
     * @author zhouronghua
     * @time 2021/9/26 7:39 下午
     */
    @Test
    fun testStringExtract() {
        println("=== 测试字符串扩展函数 ===")
        val str = "我是中国人"
        println(str.addDecorate(8))
        // 打印日志
        println(100.easyPrint())
        // 测试可空扩展函数
        val myStr: String? = null
        myStr.printWithDefault("default string")
        // infix方式调用：不需要点，采用空格，参数不需要一对括号，采用空格
        myStr printWithDefault "default string"
    }

    /**
     * 扩展文件采用import引入randomTake扩展函数
     *
     */
    @Test
    fun testExtractFile() {
        println("=== 测试扩展文件 ===")
        val p = listOf("Jason", "Lucky", "MingMing")
        println(p.randomTake())
    }

    /**
     * 重命名扩展函数
     * import 对应的扩展函数，as 起别名
     * import com.example.demokotlin.addBrackets as bracketString
     *
     */
    @Test
    fun testExtractRename() {
        println("=== 测试扩展函数别名 ===")
        val p = listOf("Jason", "Lucky", "MingMing")
        p.forEach {
            println(it.bracketString())
        }
    }
}